home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 201-225 / 201 / draco / src / time.d < prev    next >
Text File  |  1995-03-13  |  3KB  |  138 lines

  1. #drinc:libraries/dos.g
  2.  
  3. proc printStr(register *char message)void:
  4.     register *char p;
  5.  
  6.     p := message;
  7.     while p* ~= '\e' do
  8.     p := p + sizeof(char);
  9.     od;
  10.     ignore Write(Output(), message, p - message);
  11. corp;
  12.  
  13. proc printNum(register ulong n)void:
  14.     [12] char buffer;
  15.     register *char p;
  16.  
  17.     p := &buffer[11];
  18.     p* := '\e';
  19.     while
  20.     p := p - sizeof(char);
  21.     p* := n % 10 + '0';
  22.     n := n / 10;
  23.     n ~= 0
  24.     do
  25.     od;
  26.     printStr(p);
  27. corp;
  28.  
  29. proc abort(*char message)void:
  30.  
  31.     printStr(message);
  32.     Exit(20);
  33. corp;
  34.  
  35. proc main()void:
  36.     uint
  37.     OP_MOVEL = 0x2000,
  38.     M_DDIR = 0o0,
  39.     M_ADIR = 0o1,
  40.     M_DISP = 0o5,
  41.     R_A0 = 0,
  42.     R_FP = 6,
  43.     R_D0 = 0;
  44.     extern GetPars(*ulong pLen; **char pPtr)void;
  45.     *char xptr;
  46.     ulong xlen;
  47.     register *char ptr, start;
  48.     register long len;
  49.     register int minutes, ticks, fraction;
  50.     proc()void procPtr;
  51.     Segment_t seg;
  52.     DateStamp_t startTime, endTime;
  53.  
  54.     if OpenDosLibrary(0) ~= nil then
  55.     GetPars(&xlen, &xptr);
  56.     ptr := xptr;
  57.     len := xlen;
  58.     while len ~= 0 and (ptr* = ' ' or ptr* = '\t') do
  59.         ptr := ptr + sizeof(char);
  60.         len := len - 1;
  61.     od;
  62.     if len = 0 or ptr* = '\e' or ptr* = '\r' or ptr* = '\n' then
  63.         abort("Use is: time prog [args]\n");
  64.     fi;
  65.     start := ptr;
  66.     while len ~= 0 and ptr* ~= ' ' and ptr* ~= '\e' and ptr* ~= '\r' and
  67.         ptr* ~= '\n'
  68.     do
  69.         ptr := ptr + sizeof(char);
  70.         len := len - 1;
  71.     od;
  72.     if ptr* ~= '\e' then
  73.         ptr* := '\e';
  74.         ptr := ptr + sizeof(char);
  75.         len := len - 1;
  76.     fi;
  77.     seg := LoadSeg(start);
  78.     if seg = 0 then
  79.         printStr("time: could not load '");
  80.         printStr(start);
  81.         abort("'\n");
  82.     fi;
  83.     procPtr := pretend((seg + 1) << 2, proc()void);
  84.     DateStamp(&startTime);
  85.     xptr := ptr;
  86.     xlen := len;
  87.     code(
  88.         OP_MOVEL | R_A0 << 9 | M_ADIR << 6 | M_DISP << 3 | R_FP,
  89.         xptr,
  90.         OP_MOVEL | R_D0 << 9 | M_DDIR << 6 | M_DISP << 3 | R_FP,
  91.         xlen
  92.     );
  93.     procPtr();
  94.     DateStamp(&endTime);
  95.     if not UnLoadSeg(seg) then
  96.         abort("time: can't unload program\n");
  97.     fi;
  98.     minutes := endTime.ds_Minute - startTime.ds_Minute;
  99.     ticks := endTime.ds_Tick - startTime.ds_Tick;
  100.     if ticks < 0 then
  101.         ticks := ticks + 50 * 60;
  102.         minutes := minutes - 1;
  103.     fi;
  104.     fraction := ticks % 50 * 2;
  105.     printStr("Run time = ");
  106.     if minutes = 0 then
  107.         printNum(ticks / 50);
  108.         printStr(".");
  109.         if fraction < 10 then
  110.         printStr("0");
  111.         fi;
  112.         printNum(fraction);
  113.         printStr(" seconds\n");
  114.     else
  115.         printNum(minutes);
  116.         printStr(" minutes, ");
  117.         printNum(ticks / 50);
  118.         printStr(".");
  119.         if fraction < 10 then
  120.         printStr("0");
  121.         fi;
  122.         printNum(fraction);
  123.         printStr(" seconds (");
  124.         minutes := minutes * (50 * 60);
  125.         ticks := ticks + minutes;
  126.         printNum(ticks / 50);
  127.         printStr(".");
  128.         fraction := ticks % 50 * 2;
  129.         if fraction < 10 then
  130.         printStr("0");
  131.         fi;
  132.         printNum(fraction);
  133.         printStr(" seconds)\n");
  134.     fi;
  135.     CloseDosLibrary();
  136.     fi;
  137. corp;
  138.